﻿using System;
using System.Windows.Forms;
using Loja.Controles.Aplicação;
using System.Threading;
using Loja.Telas;
using Loja.Padrao;
using System.Diagnostics;
using System.Drawing;

namespace Loja
{
    public partial class FormCaixa : Form
    {

        private Controle controle;

        public FormCaixa()
        {
            this.controle = new Controle();
            this.controle.IniciarVenda();     
            InitializeComponent();                    
        }
              

        private void Form1_Load(object sender, EventArgs e)
        {
            Splash splash = new Splash();
            splash.ShowDialog();

            FormLogin login = new FormLogin(controle);                      
            login.ShowDialog(this);
            this.WindowState = FormWindowState.Maximized;
                        
            user.Text = controle.Descricao;

            controle.LimpaParametros();

            controle.BuscaClienteVenda();
            txtClienteId.Text = controle.Codigo;
            txtClienteNome.Text = controle.Descricao;

            controle.BuscaVendedorVenda();
            txtVendedorId.Text = controle.Codigo;
            txtVendedorNome.Text = controle.Descricao;


            controle.LimpaParametros();
            SetaCaixa();           
        }

        private void SetaCaixa()
        {
            if (!controle.VerificarCaixa())
            {
                imagemCaixa.Image = Properties.Resources.aberto;
                toolTip.SetToolTip(imagemCaixa, "Caixa Aberto!");
                if (controle.BuscaCaixa())
                { }
            }
            else
            {
                imagemCaixa.Image = Properties.Resources.fechado;
                toolTip.SetToolTip(imagemCaixa, "Caixa Fechado!");
            }
        }

        private void ListaVendedor_Click(object sender, EventArgs e)
        {
            BuscaVendedor vendedor = new BuscaVendedor(controle);
            vendedor.ShowDialog(this);            
            txtVendedorId.Text = controle.Codigo;
            txtVendedorNome.Text = controle.Descricao;
            controle.LimpaParametros();            
        }

        private void ListaCliente_Click(object sender, EventArgs e)
        {
            BuscaCliente cliente = new BuscaCliente(controle);
            cliente.ShowDialog(this);
            txtClienteId.Text = controle.Codigo;
            txtClienteNome.Text = controle.Descricao;
            controle.LimpaParametros();
        }

        public Boolean BuscaProduto(String p)
        {
            if (controle.BuscaProduto(txtProdutoBarras.Text))
            {
                txtProdutoNome.Text = controle.Descricao;
                controle.LimpaParametros();
                return true;
            }
            else
            {
                LimpaProduto();
                return false;
            }
            
        }

        private void txtProdutoBarras_Validated(object sender, EventArgs e)
        {
               if (txtProdutoBarras.Text != "")
               {                
                   if(BuscaProduto(txtProdutoBarras.Text))
                   {                       
                       
                   }                    
                   else 
                   {
                        MessageBox.Show("Produto não encontrado!");
                        LimpaProduto();                                    
                   }
               }
               else
               {
                   txtProdutoBarras.Text = null;
               }
        }

        private void txtQuantidade_Validated(object sender, EventArgs e)
        {
            if (txtProdutoBarras.Text != "")
            {
                if (txtQuantidade.Text != "")
                {
                    listProdutos = controle.BuscaItem(listProdutos, Convert.ToInt32(txtQuantidade.Text), txtProdutoBarras.Text);
                    LimpaProduto();
                    CalculaTotal();            
                }
            }
            
        }

        public void CalculaTotal()
        {
            if (txtPorcentagem.Text == "")
            {
                double valor = 0;
                foreach (DataGridViewRow linha in listProdutos.Rows)
                {
                    valor += Convert.ToDouble(linha.Cells[3].Value);
                }

                txtTotal.Text = valor.ToString();
            }
            else
            {
                double valor = 0;
                foreach (DataGridViewRow linha in listProdutos.Rows)
                {
                    valor += Convert.ToDouble(linha.Cells[3].Value);
                }

                double percentual = Convert.ToDouble(txtPorcentagem.Text) / 100.0;
                txtDesconto.Text = (percentual * valor).ToString();

                valor = valor - (percentual * valor);

                txtTotal.Text = valor.ToString();
            }
        }

        public void LimpaProduto()
        {
            txtQuantidade.Text = null;
            txtProdutoNome.Text = null;
            txtProdutoBarras.Text = null;
        }

        public void LimpaCampos()
        {
            LimpaProduto();
            listProdutos.Rows.Clear();
            txtTotal.Text = null;
            txtPorcentagem.Text = null;
            txtDesconto.Text = null;
        }

        public void HabilitaCampos(Boolean validaParametro)
        {
            button1.Enabled = validaParametro;
        }

        private void txtPorcentagem_Validated(object sender, EventArgs e)
        {
            CalculaTotal();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (ValidaCampos()) 
            {
                DialogResult dialogo = new DialogResult();
                dialogo = MessageBox.Show("Deseja finalizar a Venda?", "Venda", MessageBoxButtons.YesNo);
                if (dialogo.ToString() == "Yes") 
                {
                    String forma = FormaPagamento();

                    if (controle.ValidaCaixaVenda())
                    {
                        if (controle.CaixaAtual())
                        {
                            if (controle.GerarVendaCompleto(txtVendedorId.Text, 
                                                            txtClienteId.Text, 
                                                            txtTotal.Text, 
                                                            txtDesconto.Text, 
                                                            forma,
                                                            listProdutos))
                            {
                                LimpaCampos();
                                MessageBox.Show("Venda Efetuada com sucesso!");
                                AlertaEstoque.Visible = false;
                                EnviaAviso(true);
                            }
                            else
                                MessageBox.Show("Erro ao gerar Venda!");                           
                            
                            /*
                            if (controle.GerarVenda(txtVendedorId.Text, txtClienteId.Text, txtTotal.Text, txtDesconto.Text, forma))
                            {
                                if (controle.GerarItemVenda(listProdutos))
                                {
                                    if (controle.NovoItemCaixa("C"))
                                    {
                                        LimpaCampos();
                                        MessageBox.Show("Venda Efetuada com sucesso!");
                                        FormAlerta aviso = new FormAlerta(controle);
                                        aviso.EnviaAviso();
                                    }
                                    else
                                    {
                                        MessageBox.Show("Erro ao gerar Item de Caixa!");
                                    }
                                }
                                else
                                    MessageBox.Show("Erro ao gerar Item de Venda!");
                            }
                            else
                                MessageBox.Show("Erro ao gerar Venda!");
                            */
                        }
                        else
                            MessageBox.Show("Caixa aberto, é um caixa antigo!");
                    }
                    else
                        MessageBox.Show("Não existe caixa aberto! \nAbra um caixa novo para proseguir!");
                }
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            DialogResult dialogo = new DialogResult();
                dialogo = MessageBox.Show("Deseja LIMPAR a Tela de Venda?", "Limpa Tela de Venda", MessageBoxButtons.YesNo);
                if (dialogo.ToString() == "Yes")
                {
                    LimpaCampos();
                    listProdutos.Rows.Clear();
                    txtTotal.Text = null;
                    txtPorcentagem.Text = null;
                    txtDesconto.Text = null;
                }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            hora.Text = DateTime.Now.ToLongTimeString();
        }

        public Boolean ValidaCampos()
        {
            if (txtVendedorId.Text == "")
            {
                MessageBox.Show("Cliente não selecionado!");
                return false;
            }
            else
                if (txtClienteId.Text == "")
                {
                    MessageBox.Show("Vendedor não selecionado!");
                    return false;
                }
                else
                    if (listProdutos.RowCount < 1)
                    {
                        MessageBox.Show("Venda não possui item!");
                        return false;
                    }

            return true;
        }

        private void sairToolStripMenuItem_Click(object sender, EventArgs e)
        {            
            /*FormAlerta aviso = new FormAlerta(controle);
            aviso.Visible = false;
            aviso.DesabilitaAvisos();            
            
            aviso.Dispose();
             */
            this.Close();
        }

        public void EnviaAviso(Boolean emiteSom)
        {
            var produtos = controle.AvisoEstoque();
            String texto = "";
            foreach (var produto in produtos)
            {
                texto = texto + produto.Descricao.ToString()
                              + " Qtd:" + produto.Quantidade.ToString()
                              + " Minimo:" + produto.EstoqueMinimo.ToString() + "\n";
            }

            /*if (components == null)
            {
                components = new System.ComponentModel.Container();
            }*/

            if (texto != "")
            {
                //AlertaEstoque = new NotifyIcon(components);
                AlertaEstoque.Icon = SystemIcons.Information; 
                AlertaEstoque.BalloonTipTitle = "Alerta do Estoque";
                AlertaEstoque.BalloonTipText = texto;
                AlertaEstoque.BalloonTipIcon = ToolTipIcon.Info;
                AlertaEstoque.Visible = true;
                AlertaEstoque.ShowBalloonTip(10);
                if (emiteSom)
                    System.Console.Beep(32767, 700);
            }
        }

        private void usuárioToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ConsultaVendedor vendedor = new ConsultaVendedor(controle);
            vendedor.ShowDialog(this);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Int32 poii = listProdutos.RowCount;

            for(Int32 i = 0; i <poii; i++)
            {
                if(listProdutos.Rows[i].Cells[0].Value != null)
                    MessageBox.Show(listProdutos.Rows[i].Cells[0].Value.ToString());
            }                
        }

        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
            ConsultaTipoCadastro c = new ConsultaTipoCadastro(controle);
            c.ShowDialog(this);
        }

        private void tipoDeProdutosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ConsultaTipoProduto c = new ConsultaTipoProduto(controle);
            c.ShowDialog(this);
        }

        private void produtoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ConsultaProdutos c = new ConsultaProdutos(controle, false);
            c.ShowDialog(this);
        }

        private void clienteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ConsultaCadastro c = new ConsultaCadastro(controle, false);
            c.ShowDialog(this);
        }     

        private void usuáriosToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ConsultaUsuario c = new ConsultaUsuario(controle);
            c.ShowDialog(this);
        }

        public String FormaPagamento() 
        {
            if (rbCartaoCredito.Checked)
                return "C";
            else
                if (rbCartaoDebito.Checked)
                    return "B";
                else
                    if (rbCheque.Checked)
                        return "H";
                    else
                        return "D";
        }

        private void vendasToolStripMenuItem_Click(object sender, EventArgs e)
        {
            RVendas c = new RVendas();
            c.ShowDialog(this);
        }

        private void compraToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ConsultaCompra c = new ConsultaCompra(controle);
            c.ShowDialog(this);
        }

        private void txtProdutoBarras_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && e.KeyChar != (char)8)
            {
                e.Handled = true;
            }
        }

        private void txtQuantidade_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && e.KeyChar != (char)8)
            {
                e.Handled = true;
            }
        }

        private void txtPorcentagem_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && e.KeyChar != (char)8)
            {
                e.Handled = true;
            }
        }

        private void contextMenuStrip1_Opening(object sender, System.ComponentModel.CancelEventArgs e)
        {

        }

        private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {

        }

        private void excluir_Click(object sender, EventArgs e)
        {
            try
            {
                listProdutos.Rows.Remove(listProdutos.CurrentRow);
            }
            catch 
            { 
            }
        }

        private void imagemCaixa_Click(object sender, EventArgs e)
        {
            //usar na proxima versão
            /*if (controle.VerificarCaixa())
                if (controle.AbrirCaixa(DateTime.Now, 0))
                {
                    MessageBox.Show("Caixa Aberto!");
                    SetaCaixa();
                }
                else
                    MessageBox.Show("Erro ao abrir Caixa!");
            else
                MessageBox.Show("Já Possui caixa Aberto!");*/

        }

        private void vendaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ConsultaVenda c = new ConsultaVenda(controle);
            c.ShowDialog(this);
        }

        private void caixaToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ConsultaCaixa c = new ConsultaCaixa(controle);
            c.ShowDialog(this);
        }

        private void estoqueToolStripMenuItem_Click(object sender, EventArgs e)
        {
            REstoque c = new REstoque(controle);
            c.ShowDialog(this);
        }

        private void txtClienteNome_TextChanged(object sender, EventArgs e)
        {

        }

        private void FormCaixa_Shown(object sender, EventArgs e)
        {
            //FormAlerta aviso = new FormAlerta(controle);
            //aviso.EnviaAviso();
            EnviaAviso(true);            
        }       

        private void FormCaixa_Activated(object sender, EventArgs e)
        {
            if (controle.VerificarCaixa())
            {
                HabilitaCampos(false);
                imagemCaixa.Image = Properties.Resources.fechado;
                toolTip.SetToolTip(imagemCaixa, "Caixa Fechado!");
            }
            else
            {
                HabilitaCampos(true);            
                imagemCaixa.Image = Properties.Resources.aberto;
                toolTip.SetToolTip(imagemCaixa, "Caixa Aberto!");
            }                      
        }

        private void button3_Click_1(object sender, EventArgs e)
        {
            
        }

        private void helpToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                Process.Start(@"Treinamento\Treinamento.htm");
            }
            catch 
            { 
            }

        }

        private void button3_Click_2(object sender, EventArgs e)
        {
            Email.al("teste", "corpo da mensagem");
        }

        private void imagemCaixa_Click_1(object sender, EventArgs e)
        {

        }

        private void button3_Click_3(object sender, EventArgs e)
        {
            FormListProdutos list = new FormListProdutos(controle);
            controle.LimpaParametros();
            list.ShowDialog(this);
            if (controle.Codigo != "" && controle.Descricao != "")
            {
                txtProdutoBarras.Text = controle.Codigo;
                txtProdutoNome.Text = controle.Descricao;
                txtQuantidade.Focus();
                BuscaProduto(txtProdutoBarras.Text);
            }
            controle.LimpaParametros();            
        }

        private void FormCaixa_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.F2) 
            {
                ConsultaCaixa c = new ConsultaCaixa(controle);
                c.ShowDialog(this);
            }
            else if (e.KeyCode == Keys.F3)
            {
                ConsultaProdutos c = new ConsultaProdutos(controle, false);
                c.ShowDialog(this);
            }
        }

        private void FormCaixa_FormClosing(object sender, FormClosingEventArgs e)
        {
            DialogResult resultado = MessageBox.Show("Tem certeza que deseja sair?", "Sair do Sistema", MessageBoxButtons.YesNo);            
            if (resultado == DialogResult.Yes)
            {
                AlertaEstoque.Visible = false;                
                e.Cancel = false;
            }
            else
            {
                e.Cancel = true;
            }
        }

        private void AlertaEstoque_Click(object sender, EventArgs e)
        {
            //AlertaEstoque.Visible = false;
            EnviaAviso(false);
        }    
    }
}